#pragma once

#include <vector>
#include <string>

using namespace std;

namespace MetricSpaceBenchmark::MLIndex::LIMS {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // each point data
    class Point {
    public:
        // coordinate of each point of n-dimentional data
        vector<double> coordinate;

        // id of each point
        unsigned id{};

        // 1-d value of point: 降维后的 LIMS 值
        unsigned long long i_value{};

        Point() = default;

        explicit Point(vector<double> &coordinate) {
            this->coordinate = coordinate;
        }

        Point(vector<double> &coordinate, unsigned id) {
            this->coordinate = coordinate;
            this->id = id;
        }

        void setIValue(unsigned long long iValue) {
            this->i_value = iValue;
        }
    };

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 插入的数据点: 注意 LIMS值的类型-double
    class InsertPt {
    public:
        // coordinate of each point of n-dimentional data
        vector<double> coordinate;

        // id of each point
        unsigned id{};

        // 1-d value of point
        double i_value{};

        InsertPt() = default;

        InsertPt(vector<double> &coordinate, unsigned id) {
            this->coordinate = coordinate;
            this->id = id;
        }

        void setIValue(double dis) {
            this->i_value = dis;
        }
    };

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 簇类: 存储一个聚簇中的所有点
    class Clu_Point {
    public:
        vector<Point> clu_point;

        Clu_Point() = default;

        explicit Clu_Point(vector<Point> &clu_point) {
            this->clu_point = clu_point;
        }
    };

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // all data point: 存储所有聚簇, 代表了整个数据集
    class All_Point {
    public:
        vector<Clu_Point> all_point;

        All_Point() = default;

        explicit All_Point(vector<Clu_Point> &all_point) {
            this->all_point = all_point;
        }
    };
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
